#制作证书及秘钥, 我们需要使用OpenSSL制作CA机构证书、服务端证书和客户端证书，以下操作均在安装Docker的Linux服务器上进行。

# 首先创建一个目录用于存储生成的证书和秘钥；
mkdir -p /data/security/docker-ca
cd /data/security/docker-ca

# 创建CA证书私钥，期间需要输入两次用户名和密码，生成文件为ca-key.pem；
openssl genrsa -aes256 -out ca-key.pem 4096

# 根据私钥创建CA证书，期间需要输入上一步设置的私钥密码，生成文件为ca.pem；
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=*" -out ca.pem

# 创建服务端私钥，生成文件为server-key.pem；
openssl genrsa -out server-key.pem 4096

# 创建服务端证书签名请求文件，用于CA证书给服务端证书签名，生成文件server.csr；
openssl req -subj "/CN=*" -sha256 -new -key server-key.pem -out server.csr

# 创建CA证书签名好的服务端证书，期间需要输入CA证书私钥密码，生成文件为server-cert.pem；
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

# 创建客户端私钥，生成文件为key.pem；
openssl genrsa -out key.pem 4096

# 创建客户端证书签名请求文件，用于CA证书给客户证书签名，生成文件client.csr；
openssl req -subj "/CN=client" -new -key key.pem -out client.csr

# 为了让秘钥适合客户端认证，创建一个扩展配置文件extfile-client.cnf；
echo extendedKeyUsage = clientAuth > extfile-client.cnf

# 创建CA证书签名好的客户端证书，期间需要输入CA证书私钥密码，生成文件为cert.pem；
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf

# 删除创建过程中多余的文件；
rm -rf ca.srl server.csr client.csr extfile-client.cnf

# 最终生成文件如下，有了它们我们就可以进行基于TLS的安全访问了。
# ca.pem CA证书
# ca-key.pem CA证书私钥
# server-cert.pem 服务端证书
# server-key.pem 服务端证书私钥
# cert.pem 客户端证书
# key.pem 客户端证书私钥

# 用vim编辑器修改docker.service文件；
# vim /usr/lib/systemd/system/docker.service
 
# 修改以ExecStart开头的配置，开启TLS认证，并配置好CA证书、服务端证书和服务端私钥，修改内容如下；
# ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --tlsverify --tlscacert=/data/security/docker-ca/ca.pem --tlscert=/data/security/docker-ca/server-cert.pem --tlskey=/data/security/docker-ca/server-key.pem
# ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem

# 重启Docker服务，这样我们的Docker服务就支持使用TLS进行远程访问了！
# systemctl daemon-reload && systemctl restart docker





